package com.ants.boot.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 日期格式化工具类
 * @author 蚂蚁会花呗
 *
 */
public class DateUtils {
	
	/**日期 YYYY-MM-DD*/
	private static final String YYYY_MM_DD = "yyyy-MM-dd"; 
	
	/**时间 YYYY-MM-DD HH:ss:mm */
	private static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; 


	/**
	 * 格式化时间 YYYY-MM-DD HH:mm:ss
	 */
	public static ThreadLocal<SimpleDateFormat> date_sdf = new ThreadLocal<SimpleDateFormat>(){
		@Override
		protected SimpleDateFormat initialValue() {
			return new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);
		}
	};
	
    public static ThreadLocal<SimpleDateFormat> date_sdf_yyyy_mm_dd = new ThreadLocal<SimpleDateFormat>() {
        @Override
        protected SimpleDateFormat initialValue() {
            return new SimpleDateFormat(YYYY_MM_DD);
        }
    };
    
    
    /**
     * 指定返回时间的格式
     * @param pattern
     * @return
     */
    private static SimpleDateFormat getSdfFormat(String pattern) {
        return new SimpleDateFormat(pattern);
    }
    
    
    /**
     * 当前日历，这里用中国时间表示
     *
     * @return 以当地时区表示的系统当前日历
     */
    public static Calendar getCalendar() {
        return Calendar.getInstance();
    }
    
    /***************************Date时间转字符串时间**************************/
    /**
     * 获取当前日期
     * @return
     */
    public static String nowDate() {
    	return date_sdf_yyyy_mm_dd.get().format(getCalendar().getTime());
    }
    
    /**
     * 获取当前日期时间 
     * YYYY-MM-DD HH:mm:ss
     * @return
     */
    public static String nowDateTime(){
    	return date_sdf.get().format(getCalendar().getTime());
    }
    
    /**
     * 返回指定格式的当前日期
     * @param pattern 要返回的日期格式
     * @return 返回指定格式的字符串的当前日期
     */
	public static String formatDate(String pattern) {
		return getSdfFormat(pattern).format(getCalendar().getTime());
	}
	
	/**
	 * 
	 * @param pattern 要返回的日期格式
	 * @param date Date 日期
	 * @return 返回指定格式的字符串日期
	 */
	public static String formatDate(String pattern,Date date) {
		return getSdfFormat(pattern).format(date);
	}
	
	/**
	 *  毫秒转字符串日期
	 * @param millisecond 毫秒时间
	 * @return YYYY-MM-DD格式的字符串日期
	 */
	public static String formatDate(long millisecond) {
		return date_sdf_yyyy_mm_dd.get().format(millisecond);
	}
	
	/**
	 * 
	 * @param pattern 要返回的日期格式
	 * @param millisecond 毫秒日期
	 * @return  返回指定格式的字符串日期
	 */
	public static String formatDate(String pattern,long millisecond) {
		return getSdfFormat(pattern).format(millisecond);
	}
	
	/**
	 *  毫秒转字符串完整日期
	 * @param millisecond 毫秒时间
	 * @return YYYY-MM-DD HH:ss:mm格式的字符串日期
	 */
	public static String formatDateTime(long millisecond) {
		return date_sdf_yyyy_mm_dd.get().format(millisecond);
	}
	

    /***
     * 格式化日期
     * @param date
     * @return YYYY-MM-DD
     */
    public static String formatDate(Date date) {
    	return date_sdf_yyyy_mm_dd.get().format(date);
	}
    
    /**
     * 格式化Date日期时间
     * @param date
     * @return YYYY-MM-DD HH:ss:mm
     */
    public static String formatDateTime(Date date) {
		return date_sdf.get().format(date);
	}
    
    
    /***************************华丽的分割线、字符串时间转Date时间 **************************/
    
    
    /**
     * 
     * @param date 字符串日期，格式YYYY-MM-DD HH:ss:mm
     * @return Date 日期
     * @throws ParseException
     */
    public static Date parseDate(String date) throws ParseException {
		return date_sdf_yyyy_mm_dd.get().parse(date);
	}
    
    /**
     * 
     * @param date 字符串日期，格式YYYY-MM-DD HH:ss:mm
     * @return Date 日期
     * @throws ParseException
     */
    public static Date parseDateTime(String date) throws ParseException {
		return date_sdf.get().parse(date);
	}
    
    /**
     * 
     * @param pattern 要返回的格式
     * @param date 字符串日期
     * @return 返回 Date 日期
     * @throws ParseException
     */
    public static Date parseDate(String pattern,String date) throws ParseException {
		return getSdfFormat(pattern).parse(date);
	}

}
